package com.jingdianjichi.subject.application.config;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.jingdianjichi.subject.application.Interceptor.SubjectInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

/**
 * Mvc全局处理
 * GlobalConfig 类
 *
 * @author 熊苏鹏1
 * @date 2025/2/25 21:43
 * @description spring配置类
 */
@Configuration
public class GlobalConfig extends WebMvcConfigurationSupport {
    /**
     * 配置消息转换器
     *
     * 该方法用于添加或配置Spring MVC使用的HTTP消息转换器
     * 消息转换器负责在HTTP请求和响应中序列化和反序列化对象
     *
     * @param converters 消息转换器的列表，可以添加自定义的消息转换器到这个列表中
     */
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 调用父类的configureMessageConverters方法，确保任何基础配置都能被应用
        super.configureMessageConverters(converters);

        // 添加自定义的Jackson消息转换器，用于处理JSON格式的数据
        converters.add(mappingJackson2HttpMessageConverter());
    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SubjectInterceptor());
    }

    /**
     * 创建并配置一个 MappingJackson2HttpMessageConverter 实例
     * 该实例用于处理 HTTP 请求和响应中的 JSON 数据转换
     * 主要目的是定制 ObjectMapper 的行为，以满足特定的序列化和反序列化需求
     *
     * @return MappingJackson2HttpMessageConverter 已配置好的转换器实例
     */
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
        // 创建一个 ObjectMapper 实例，用于 JSON 数据的处理
        ObjectMapper objectMapper = new ObjectMapper();

        // 配置 ObjectMapper，避免在序列化空对象时抛出异常
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);

        // 设置 ObjectMapper 只序列化非空对象，以避免在 JSON 输出中包含不必要的空值
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // 返回一个新的 MappingJackson2HttpMessageConverter 实例，并使用已配置的 ObjectMapper
        return new MappingJackson2HttpMessageConverter(objectMapper);
    }
}
